package com.summer.safe.utils;


import com.alibaba.fastjson.JSON;
import com.summer.safe.config.result.ResultCode;
import com.summer.safe.exception.CustomException;
import com.summer.safe.system.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 工具类
 */
public class ToolUtil {
    /**
     * 获得配置文件中的属性
     */
    private static Environment environment = SpringContextUtil.getApplicationContext().getEnvironment();


    /**
     * 获取临时目录
     *
     * @author stylefeng
     * @Date 2017/5/24 22:35
     */
    public static String getTempPath() {
        return System.getProperty("java.io.tmpdir");
    }

    /**
     * 对象是否不为空(新增)
     *
     * @param o String,List,Map,Object[],int[],long[]
     * @return
     */
    public static boolean isNotEmpty(Object o) {
        return !isEmpty(o);
    }

    /**
     * 对象是否为空
     *
     * @param o String,List,Map,Object[],int[],long[]
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object o) {
        if (o == null) {
            return true;
        }
        if (o instanceof String) {
            if (o.toString().trim().equals("")) {
                return true;
            }
        } else if (o instanceof List) {
            if (((List) o).size() == 0) {
                return true;
            }
        } else if (o instanceof Map) {
            if (((Map) o).size() == 0) {
                return true;
            }
        } else if (o instanceof Set) {
            if (((Set) o).size() == 0) {
                return true;
            }
        } else if (o instanceof Object[]) {
            if (((Object[]) o).length == 0) {
                return true;
            }
        } else if (o instanceof int[]) {
            if (((int[]) o).length == 0) {
                return true;
            }
        } else if (o instanceof long[]) {
            if (((long[]) o).length == 0) {
                return true;
            }
        }
        return false;
    }

    /***
     * 获取当前系统名称
     * @return
     */
    public static String getApplicationName() {
        try {
            //当前系统名称
            String property = environment.getProperty("config.product-name");
            return isNotEmpty(property) ? property : "";
        } catch (Exception e) {
            Logger logger = LoggerFactory.getLogger(ToolUtil.class);
            logger.error("获取当前系统名称出错！", e);
            return "";
        }
    }

    /**
     * 获得配置文件中的字段属性
     */
    public static String getConfigName(String name) {
        try {
            //当前系统名称
            String property = environment.getProperty(name);
            return isNotEmpty(property) ? property : "";
        } catch (Exception e) {
            Logger logger = LoggerFactory.getLogger(ToolUtil.class);
            logger.error("获得配置文件中的属性值出错！", e);
            return "";
        }
    }

    /**
     * 获得包的路径
     */
    public static String getPackageName() {

            return getConfigName("mybatis.typeAliasesPackage");
        }
    /**
     * 演示模式
     */
    public static void DemoMode() {
        String  demomode= environment.getProperty("config.demo-mode");
        if(demomode.equals("true")){
            throw new CustomException(ResultCode.DEMO_MODE_ERROR);
        }
    }
    /**
     * 对象是否为true
     *
     * @param obj
     * @return
     */
    public static boolean isTrue(Object obj) {
        return isNotEmpty(obj) ? obj.equals("true") || obj.equals(true) : false;
    }

    /**
     * 首字母大写
     *
     * @author stylefeng
     * @Date 2017/5/7 22:01
     */
    public static String firstLetterToUpper(String val) {
        return StringUtils.firstCharToUpperCase(val);
    }

    /**
     * 首字母小写
     *
     * @author stylefeng
     * @Date 2017/5/7 22:02
     */
    public static String firstLetterToLower(String val) {
        return StringUtils.firstCharToLowerCase(val);
    }

    public static String formatDate(Date date, String pattern){
        if(date == null){
            return "";
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(date);
    }

    /**
     * 驼峰数据库字段
     *
     * @param val
     * @return
     */
    public static String humpStr(String val) {
        StringBuilder sb = new StringBuilder();
        String[] vs = val.split("_");
        for (String v : vs) {
            sb.append(StringUtils.firstCharToUpperCase(v));
        }
        return sb.toString();
    }

    /**
     * 将数据库中表截取下划线第一次出现,只保留下划线后面的
     * @param val
     * @return
     */
    public static String intercept(String val) {
        StringBuilder sb = new StringBuilder();
        //去掉第一次下划线之前的值
        if(val.contains("_")){
            String value=val.substring(val.indexOf("_")+1,val.length());
            //截取后如果还包含下划线，继续
            if(value.contains("_")){
                String[] vs = value.split("_");
                for (String v : vs) {
                    sb.append(StringUtils.firstCharToUpperCase(v));
                }
            }else {
                sb.append(StringUtils.firstCharToUpperCase(value));
            }

        }

        return sb.toString();
    }
    /**
     * 数组合并
     *
     * @param objects
     */
    public static Object[] arrayMerge(List<Object[]> objects) {
        Object[] var1 = new Object[0];
        for (Object[] var2 : objects) {
            var1 = arrayMerge(var1, var2);
        }
        return var1;
    }

    /**
     * 数组合并
     *
     * @param o1
     */
    public static Object[] arrayMerge(Object[] o1, Object[] o2) {
        int len1 = o1.length;
        int len2 = o2.length;
        o1 = Arrays.copyOf(o1, len1 + len2);
        System.arraycopy(o2, 0, o1, len1, len2);
        return o1;
    }

    /**
     * 是否是基类字段
     *
     * @return
     */
    public static Boolean getIsNotBaseField(String val) {
        return !StringUtils.equals(val, "id")
                && !StringUtils.equals(val, "remarks")
                && !StringUtils.equals(val, "sort")
                && !StringUtils.equals(val, "createBy")
                && !StringUtils.equals(val, "createDate")
                && !StringUtils.equals(val, "updateBy")
                && !StringUtils.equals(val, "updateDate")
                && !StringUtils.equals(val, "delFlag");
    }

    /**
     * 返回字典列表（JSON）
     *
     * @param type
     * @return
     */
    public static String getDictListJson(String type) {
        return JSON.toJSONString(DictUtils.getDictList(type));
    }
    /**
     * 获得字典类型
     */

    public static List getDictTypeList() {
        return DictUtils.getDictTypeList();
    }

    /**
     * 返回字典列表（list）
     *
     * @param type
     * @return
     */
    public static List getDictList(String type) {
        return DictUtils.getDictList(type);
    }

    /**
     * 根据字典类型和值，返回对应标签名称（String）
     * @param value
     * @param type
     * @return
     */
    public static String getDictLabel(String value,String type) {
        return DictUtils.getDictLabel(value,type,"");
    }


    /**
     * 防止浏览器缓存
     *
     * @return
     */
    public static Long getVersion() {
        Long code = (long)1;
        String  profiles= (String) SessionUtils.getSessionAttribute("profiles");
        if(profiles.equals(Global.PROFILES_PROD)){
            code=System.currentTimeMillis();
        }else if (profiles.equals(Global.PROFILES_DEV)){
            code=code;
        }

        return code;
    }

    /**
     * 获取当前用户
     *
     * @return User
     */
    public static User getUser() {
        User user = UserUtils.getUser();
        //处理头像路径
        String photo = StringUtils.isEmpty(user.getPhoto())?"":user.getPhoto();
        user.setPhoto(photo.replace("|",""));
        if(StringUtils.isEmpty(user.getPhoto())){
            user.setPhoto("/static/images/default_head.png");
        }
        return user;
    }




    public static List getMainNavList() {
        return null;
    }

    /**
     * 获取当前用户
     *
     * @return jSON
     */
    public static String getUserJson(){
        return JSON.toJSONString(getUser());
    }

    /**
     * 操作系统
     * @return
     */

    public static boolean getSystemOs() {
        boolean systemos;

        String os = System.getProperty("os.name");
        //如果是Windows系统
        if(os.toLowerCase().startsWith("win")){
            systemos=true;
        }else {
            //linux 和mac
            systemos=false;
        }
        return systemos;
    }





}
